package com.linwen.excise.leetcode;

/**
 * @ClassName 连续整数求和
 * @Description 829. 连续整数求和
 * @Author lin
 * @Date 2022/2/24 下午11:14
 * @Version V1.0
 */
/**
 * 给定一个正整数 n，返回 连续正整数满足所有数字之和为 n 的组数 。 
 * 示例 1:
 *
 * 输入: n = 5
 * 输出: 2
 * 解释: 5 = 2 + 3，共有两组连续整数([5],[2,3])求和后为 5。
 *
 * 首先，最小的两个连续正整数相加1+2=3，大点的就是2+3=5=1+2+2，再大点3+4=7=2+3+2=1+2+(2+2)，从中可以看出如果存在两个连续正整数之和等于N，那么必然N=1+2+2k(k为正整数)，N-(1+2)可以整除2，即(N-(1+2))%2 == 0.
 * 往下推，n个连续正整数就是，(N-(1+2+...+n))%n == 0
 * */
public class _829连续整数求和 {
    public static void main(String[] args) {
        int n = 15;
        System.out.println(consecutiveNumbersSum(n));

    }
    public static int consecutiveNumbersSum(int N) {
        int result = 1;
        int sum = 1;
        //一个连续正整数即N本身，我们从2开始逐一判断，true则加1
        for (int i=2; (sum+=i)<=N; i++) {
            if ((N-sum)%i == 0) {
                result++;
            }
        }
        return result;
    }

}
